package com.bipbip.controlador;

import java.util.ArrayList;
import java.util.List;

import javax.validation.Valid;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;

import com.bipbip.modelo.NotificacionStandard;
import com.bipbip.modelo.Producto;
import com.bipbip.modelo.Usuario;
import com.bipbip.service.NotificacionesFactory;
import com.bipbip.service.NotificacionesService;
import com.bipbip.service.UsuarioService;

@Controller
@RequestMapping("/perfil")
@SessionAttributes({ "usuario", "cabeceraDinamica", "lateralDinamico" })
public class PerfilUsuarioController {

	private static final Logger log = Logger
			.getLogger(PerfilUsuarioController.class);

	@Autowired
	private UsuarioService usuarioService;

	@Autowired
	private NotificacionesService notService;

	@RequestMapping(value = "", method = RequestMethod.GET)
	public String verPerfil(Model model, Usuario usuario) {
		model.addAttribute("user", usuario);
		model.addAttribute("isMine", true);
		boolean esCertificado = (usuario.getIdProducto() != Producto.free);
		model.addAttribute("certificado", esCertificado);

		List<NotificacionStandard> nots = notService
				.getNotificacionesDelUsuario(usuario.getId());
		List<NotificacionStandard> mensajes = new ArrayList<NotificacionStandard>();
		for (NotificacionStandard n : nots) {
			if (n.getTipo() == NotificacionStandard.COMENTARIO_PERFIL) {
				mensajes.add(n);
			}
		}
		model.addAttribute("uService", usuarioService);
		model.addAttribute("mensajes", mensajes);
		return "perfil";
	}

	@RequestMapping(value = "/{idUsuario}", method = RequestMethod.GET)
	public String verPerfil(Model model, @PathVariable Integer idUsuario) {
		Usuario u = usuarioService.getUsuarioById(idUsuario);
		if (u != null) {
			model.addAttribute("user", u);
			model.addAttribute("isMine", false);
			boolean esCertificado = (u.getIdProducto() != Producto.free);
			model.addAttribute("certificado", esCertificado);

			List<NotificacionStandard> nots = notService
					.getNotificacionesDelUsuario(idUsuario);
			List<NotificacionStandard> mensajes = new ArrayList<NotificacionStandard>();
			for (NotificacionStandard n : nots) {
				if (n.getTipo() == NotificacionStandard.COMENTARIO_PERFIL) {
					mensajes.add(n);
				}
			}
			model.addAttribute("uService", usuarioService);
			model.addAttribute("mensajes", mensajes);

			return "perfil";
		}
		return "redirect:../";
	}

	@RequestMapping(value = "/editar", method = RequestMethod.GET)
	public String editarPerfil(Model model) {
		return "editarPerfil";
	}

	@RequestMapping(value = "/editar", method = RequestMethod.POST)
	public String guardarPerfil(Model model,
			@ModelAttribute("usuario") @Valid Usuario usuario,
			BindingResult result) {
		if (result.hasErrors()) {
			return "editarPerfil";
		}
		usuarioService.saveUsuario(usuario);
		return "perfil";
	}

	@RequestMapping(value = "/{idUsuario}", method = RequestMethod.POST)
	public String comentarPerfil(Model model, @PathVariable Integer idUsuario,
			@Valid String mensaje, Usuario u, BindingResult result) {
		if (result.hasErrors()) {
			return "redirect:/perfil/"  + idUsuario;
		}
		NotificacionesFactory factory = new NotificacionesFactory();
		notService.guardarNotificacion(factory.crearComentarioPerfil(mensaje,
				u, usuarioService.getUsuarioById(idUsuario)));
		return "redirect:/perfil/" + idUsuario;
	}
}
